package cn.qyd.threadpool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;

/**
 * @author 邱运铎
 * 下面写了这么多Executors工具类创建线程池，但不推荐这么做
 * newFixedThreadPool中默认使用了LinkedBlockingQueue作为组赛队列，队列容量默认无限大，在任务过多时容易造成内存溢出
 * newCachedThreadPool由于线程核心无限大，当任务过多会导致创建大量线程，可能使机器负载过高导致服务宕机。
 *
 * 项目实际中使用线程池时设定的数量分两种情况
 * cpu密集型： cpu核心数 + 1
 * IO密集型： cpu核心数 * 2
 * @date 2024-03-23 0:29
 */
public class NewThreadPoolDemo {
    public static void main(String[] args) {
        //固定数量的线程池，核心线程数量和最大线程数量相同
        ExecutorService executorService = Executors.newFixedThreadPool(4);
        //单个线程数量的线程池
        ExecutorService executorService1 = Executors.newSingleThreadExecutor();
        //接近无限大数量的线程池
        ExecutorService executorService2 = Executors.newCachedThreadPool();
        //带有定时调度功能的线程池
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(4);
        //获取CPU核心数量
        System.out.println(Runtime.getRuntime().availableProcessors());
    }
}
